package com.web.service.impl;

import com.util.CookieUtils;
import com.util.SessionUtils;
import com.web.dao.UserInfoMapper;
import com.web.dto.UserInfoDTO;
import com.web.model.UserInfo;
import com.web.response.Result;
import com.web.service.UserInfoService;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * @author yangguanzan
 * @date 9/23/21
 * @description
 */
@Service
public class UserInfoServiceImpl implements UserInfoService {

    @Autowired
    UserInfoMapper userInfoMapper;

    /**
     * 注册用户信息
     *
     * @param userInfoDTO 用户信息
     */
    @Override
    public Result regist(UserInfoDTO userInfoDTO) {

        if(null==userInfoDTO){
            return Result.badRequest("用户信息为空");
        }
        if(StringUtils.isEmpty(userInfoDTO.getUsername())){
            return Result.badRequest("请填写用户账号");
        }
        // 验证两次密码是否正确,验证失败
        if(!userInfoDTO.checkTwoPassword()){
            userInfoDTO.setPassword(null);
            userInfoDTO.setPasswordConfirm(null);
            return Result.badRequest("二次密码填写不一致");
        }

        // 验证账号是否存在
//        UserInfoExample example = new UserInfoExample();
//        UserInfoExample.Criteria criteria = example.createCriteria();
//        criteria.andUsernameEqualTo(userInfoDTO.getUsername());
//        List<UserInfo> userInfoList = userInfoMapper.selectByExample(example);
        //验证失败
//        if(null!=userInfoList&&userInfoList.size()>0){
//            return false;
//        }
        if(null!=userInfoMapper.findByUserName(userInfoDTO.getUsername())){
            userInfoDTO.setUsername(null);
            return Result.forbidded("已有账号注册");
        }
        try{
            if(userInfoMapper.insertSelective(userInfoDTO.toUserInfo())>0){
                return Result.success("注册成功");
            }
        }catch (DuplicateKeyException e) {
            e.printStackTrace();
            userInfoDTO.setUsername(null);
            return Result.forbidded("已有账号注册");
        }
        return Result.fail("注册失败");
    }

    /**
     * 登录服务
     *
     * @param username 账号
     * @param password 密码
     * @param verifyCode 验证码
     * @param rememberMe 记住我
     */
    @Override
    public Result login(HttpServletResponse resp,HttpSession session,String username,
        String password, String verifyCode, Boolean rememberMe) {
        //获取请求的账号、密码、和验证码,验证其合法
        if (StringUtils.isEmpty(username)) {
            return Result.badRequest("请输入账号");
        }
        if (StringUtils.isEmpty(password)) {
            return Result.badRequest("请输入密码");
        }
        if (StringUtils.isEmpty(verifyCode)) {
            return Result.badRequest("请输入验证码");
        }

        //先验证验证码是否正确，不正确则提示错误
        if (!SessionUtils.getVerifyCode(session)
            .equals(verifyCode.toLowerCase())) {
            return Result.badRequest("验证码错误");
        }

        // 根据用户名查询用户信息
        UserInfo userInfo=userInfoMapper.findByUserName(username);
        // 获取不到对应的用户信息，则登录失败，提示账号或密码错误
        if(null == userInfo || !password.equals(userInfo.getPassword())){
            return Result.badRequest("账号或密码错误");
        }
        //session只保留展示的信息
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        userInfoDTO.setUsername(userInfo.getUsername());
        userInfoDTO.setNickName(userInfo.getNickName());
        //获取到对应的用户信息，则登录成功，设置session。
        SessionUtils.setUser(session,userInfoDTO);
        //设置记住我的cookie
        if(Boolean.TRUE.equals(rememberMe)){
            CookieUtils.setUsername(resp,username);
        }else{
            CookieUtils.removeUsername(resp,username);
        }

        return Result.success();
    }
}
